package com.doraemon.handler;

import com.doraemon.constant.MessageConstant;
import com.doraemon.exception.BaseException;
import com.doraemon.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理器，处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /***
     * 捕获业务异常
     * ---
     * @param ex
     * @return: com.doraemon.result.Result
     */
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex) {
        log.error("异常信息：{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }

    /***
     * 处理SQL异常（用户名重复）
     * ---
     * @param ex
     * @return: com.doraemon.result.Result
     */
    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex) {

        // 1.获取异常信息
        String message = ex.getMessage();

        // 2.异常信息出现“Duplicate entry”时，代表用户名重复
        if (message.contains("Duplicate entry")) {

            // 3.以空格切割异常字符串
            String[] split = message.split(" ");

            // 4.获取重复的用户名
            String username = split[2];

            // 5.定义异常信息（“（重复的用户名）已存在”）
            String msg = username + MessageConstant.ALREADY_EXISTS;

            // 6.将自定义异常信息返回给前端
            return Result.error(msg);
        } else return Result.error(MessageConstant.UNKNOWN_ERROR); // 否则返回“未知错误”
    }

    /***
     * 处理SQL异常（口味为空）
     * ---
     * @param ex
     * @return: com.doraemon.result.Result
     */
    // fixme 菜品口味mapper层：传参口味集合为空时抛SQLSyntaxErrorException
    // TODO Service层进行口味集合为空判断，待优化
    /*@ExceptionHandler
    public Result exceptionHandler(SQLSyntaxErrorException ex) {

        // 返回前端异常信息：“口味为空，不能修改”
        return Result.error(MessageConstant.FLAVOR_IS_NULL);
    }*/

}
